#!/bin/bash

# 智能门禁系统服务停止脚本
# 使用方法: ./stop_services.sh

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR"

# PID文件路径
BACKEND_PID_FILE="$PROJECT_ROOT/backend.pid"
FRONTEND_PID_FILE="$PROJECT_ROOT/frontend.pid"

echo -e "${BLUE}======================================${NC}"
echo -e "${BLUE}   智能门禁系统服务停止脚本${NC}"
echo -e "${BLUE}======================================${NC}"

# 停止指定服务
stop_service() {
    local service_name="$1"
    local pid_file="$2"
    
    if [ -f "$pid_file" ]; then
        local pid=$(cat "$pid_file")
        if kill -0 "$pid" 2>/dev/null; then
            echo -e "${YELLOW}正在停止 $service_name 服务 (PID: $pid)...${NC}"
            
            # 尝试优雅关闭
            kill "$pid"
            
            # 等待最多10秒
            local count=0
            while [ $count -lt 10 ] && kill -0 "$pid" 2>/dev/null; do
                sleep 1
                count=$((count + 1))
            done
            
            # 如果还在运行，强制终止
            if kill -0 "$pid" 2>/dev/null; then
                echo -e "${YELLOW}优雅关闭失败，强制终止 $service_name...${NC}"
                kill -9 "$pid" 2>/dev/null
            fi
            
            if ! kill -0 "$pid" 2>/dev/null; then
                echo -e "${GREEN}✓ $service_name 服务已停止${NC}"
            else
                echo -e "${RED}✗ 无法停止 $service_name 服务${NC}"
                return 1
            fi
        else
            echo -e "${YELLOW}$service_name 服务未运行${NC}"
        fi
        
        # 删除PID文件
        rm -f "$pid_file"
    else
        echo -e "${YELLOW}未找到 $service_name 的PID文件${NC}"
    fi
    
    return 0
}

# 清理node_modules/.vite缓存进程
cleanup_node_processes() {
    echo -e "${BLUE}清理相关Node.js进程...${NC}"
    
    # 查找并终止可能的npm/vite进程
    pkill -f "vite" 2>/dev/null && echo -e "${GREEN}✓ 已清理Vite进程${NC}"
    pkill -f "npm.*dev" 2>/dev/null && echo -e "${GREEN}✓ 已清理npm dev进程${NC}"
}

# 显示当前进程状态
show_process_status() {
    echo -e "${BLUE}======================================${NC}"
    echo -e "${BLUE}当前相关进程状态:${NC}"
    echo -e "${BLUE}======================================${NC}"
    
    # 检查Django进程
    if pgrep -f "manage.py runserver" > /dev/null; then
        echo -e "${YELLOW}Django进程仍在运行:${NC}"
        pgrep -f "manage.py runserver" | while read pid; do
            echo -e "  PID: $pid"
        done
    fi
    
    # 检查Node.js/Vite进程
    if pgrep -f "vite\|npm.*dev" > /dev/null; then
        echo -e "${YELLOW}Node.js/Vite进程仍在运行:${NC}"
        pgrep -f "vite\|npm.*dev" | while read pid; do
            echo -e "  PID: $pid"
        done
    fi
    
    # 检查端口占用
    echo -e "${BLUE}端口占用情况:${NC}"
    netstat -tlnp 2>/dev/null | grep -E ":8000|:5173" | while read line; do
        echo -e "  $line"
    done
}

# 主执行流程
main() {
    local stopped_any=false
    
    # 停止后端服务
    if stop_service "后端 (Django)" "$BACKEND_PID_FILE"; then
        stopped_any=true
    fi
    
    # 停止前端服务
    if stop_service "前端 (React)" "$FRONTEND_PID_FILE"; then
        stopped_any=true
    fi
    
    # 清理Node.js进程
    cleanup_node_processes
    
    # 等待一下，让进程完全关闭
    sleep 2
    
    # 显示最终状态
    if $stopped_any; then
        echo -e "${GREEN}======================================${NC}"
        echo -e "${GREEN}服务停止完成！${NC}"
        echo -e "${GREEN}======================================${NC}"
    else
        echo -e "${YELLOW}======================================${NC}"
        echo -e "${YELLOW}没有发现运行中的服务${NC}"
        echo -e "${YELLOW}======================================${NC}"
    fi
    
    # 显示进程状态（用于调试）
    show_process_status
    
    echo -e "${BLUE}如需重新启动服务，请运行: ./start_services.sh${NC}"
}

# 执行主函数
main "$@"